package com.wangdong.mijiqiqi.twotype;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;

import com.wangdong.mijiqiqi.R;


/**
 * 作者：wangdong on 2018/10/19 10:44
 * 邮箱：2100520956@qq.com
 */

public abstract class BaseTwoActivity extends AppCompatActivity
{
    /**
     * 对话框 (如需要监听对话框点击事件 请在子类中覆写onPositive和onNegative方法)
     **/
    protected Dialog mDialog;
    /**
     * AlertDialog.Builder
     **/
    protected AlertDialog.Builder mBuilder;
    /**
     * 自定义的对话框
     **/
    protected Dialog mCustomDialog;
    /**
     * 上下文
     **/
    public Activity mActivity;
    /**
     * 记录上次点击按钮的时间
     **/
    private long lastClickTime;
    /**
     * 按钮连续点击最低间隔时间 单位：毫秒
     **/
    public final static int CLICK_TIME = 500;
    /**
     * 提示信息
     **/
    private Toast mToast;

    /**
     * 进度条对话框
     **/
    protected ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AppActivityManager.getInstance().addActivity(this);
        mActivity = this;
        initUI();
        initData(savedInstanceState);
        System.out.println("--->" + this.getClass().getName());
        initListener();
        ViewServer.get(this).addWindow(this);// 帮助我们更好地检视和设计用户界面(UI)
    }

    /**
     * 初始化ui
     **/
    protected abstract void initUI();

    /**
     * 初始化数据
     **/
    protected abstract void initData(Bundle savedInstanceState);

    /**
     * 初始化监听
     **/
    protected abstract void initListener();

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        saveInstanceState(outState);
        super.onSaveInstanceState(outState);
    }
    /**
     * 保存activity状态
     **/
    protected void saveInstanceState(Bundle outState) {

    }

    /**
     * 使当前应用的所有activity在响应返回键关闭的时候执行左右位移关闭页面动画
     */
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        overridePendingTransition(R.anim.slide_left_in, R.anim.slide_right_out);
    }

    @Override
    protected void onResume() {
        super.onResume();
        ViewServer.get(this).setFocusedWindow(this);

    }

    @Override
    protected void onPause() {
        super.onPause();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ViewServer.get(this).removeWindow(this);
    }
    /**
     * 验证上次点击按钮时间间隔，防止重复点击
     */
    public boolean verifyClickTime() {

        //现在时间-点击时间 <=500毫秒
        if (System.currentTimeMillis() - lastClickTime <= CLICK_TIME) {
            return false;
        }
        lastClickTime = System.currentTimeMillis();
        return true;
    }

    /**
     * 收起键盘
     */
    public void closeInputMethod() {
        // 收起键盘
        View view = getWindow().peekDecorView();// 用于判断虚拟软键盘是否是显示的
        if (view != null) {
            InputMethodManager inputmanger = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputmanger.hideSoftInputFromWindow(view.getWindowToken(),
                    InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

    /**
     * 如果字符串为空，显示默认值
     */
    protected String string(String string) {
        if (TextUtils.isEmpty(string)) {
            return Constant.STRING_DEFULT;
        }
        return string;
    }

    /**
     * 如果字符串为空，显示默认值
     */
    protected CharSequence string(CharSequence string) {
        if (TextUtils.isEmpty(string)) {
            return Constant.STRING_DEFULT;
        }
        return string;
    }


    /**
     * 获取string
     *
     * @param mRid
     * @return
     */
    protected String getStringMethod(int mRid) {
        return this.getResources().getString(mRid);
    }

    /**
     * 获取demin
     *
     * @param mRid
     * @return
     */
    protected int getDemonIntegerMethod(int mRid) {
        return (int) this.getResources().getDimension(mRid);
    }

    /**
     * 显示toast信息，长时间显示
     *
     * @param string
     */
    protected void showMsgLongTime(String string) {
        if (mToast == null) {
            mToast = Toast.makeText(this, string, Toast.LENGTH_LONG);
        } else {
            mToast.setText(string);
        }
        mToast.show();
    }

    /**
     * 显示toast信息，短时间显示
     *
     * @param string
     */
    protected void showMsgShortTime(String string) {
        if (mToast == null) {
            mToast = Toast.makeText(this, string, Toast.LENGTH_SHORT);
        } else {
            mToast.setText(string);
        }
        mToast.show();
    }


    /**
     * 显示一个进度条对话框  原生的进度条dialog不好看
     *
     * @param title        标题
     * @param content      内容
     * @param isCancelable 是否可以取消
     */
    protected void showProgressDialog(String title, String content,
                                      boolean isCancelable) {
        // 当前有显示的ProgressDialog，则不做操作
        if (mProgressDialog != null && mProgressDialog.isShowing()) {
            return;
        }
        mProgressDialog = new ProgressDialog(this, R.style.ThemeDialogWhite);
        mProgressDialog.setCanceledOnTouchOutside(isCancelable);
        mProgressDialog.setCancelable(isCancelable);
        mProgressDialog.setTitle(title);
        mProgressDialog.setMessage(content);
        mProgressDialog.show();
    }

    /**
     * 关闭进度条对话框
     */
    protected void dismissProgressDialog() {
        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
            mProgressDialog = null;
        }
    }
    /**
     * 创建并显示一个Dialog
     *
     * @param dialogId     Dialog的标识
     * @param title        标题
     * @param message      内容
     * @param positive     确认文本
     * @param negative     取消文本
     * @param isCancelable 是否可以取消
     */
    protected void showDialog(final int dialogId, String title, String message,
                              String positive, String negative, boolean isCancelable) {

        // 当前有显示的Dialog，则不做操作
        if (mDialog != null && mDialog.isShowing()) {
            return;
        }

        if (mBuilder == null) {
            mBuilder = new AlertDialog.Builder(this, R.style.ThemeDialogWhite);
        }
        mBuilder.setIcon(android.R.drawable.ic_dialog_info).setTitle(title)
                .setMessage(message).setCancelable(isCancelable)
                .setPositiveButton(positive, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        onPositive(dialogId);
                    }
                }).setNegativeButton(negative, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                onNegative(dialogId);
            }
        });
        mDialog = mBuilder.create();
        mDialog.setCanceledOnTouchOutside(isCancelable);
        mDialog.show();
    }

    /**
     * 创建并显示一个Dialog,只有一个按钮
     *
     * @param dialogId     Dialog的标识
     * @param title        标题
     * @param message      内容
     * @param positive     按钮文本
     * @param isCancelable 是否可以取消
     */
    protected void showDialog(final int dialogId, String title, String message,
                              String positive, boolean isCancelable) {

        // 当前有显示的Dialog，则不做操作
        if (mDialog != null && mDialog.isShowing()) {
            return;
        }

        if (mBuilder == null) {
            mBuilder = new AlertDialog.Builder(this, R.style.ThemeDialogWhite);
        }
        mBuilder.setIcon(android.R.drawable.ic_dialog_info).setTitle(title)
                .setMessage(message).setCancelable(isCancelable)
                .setPositiveButton(positive, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        onPositive(dialogId);
                    }
                });
        mDialog = mBuilder.create();
        mDialog.setCanceledOnTouchOutside(isCancelable);
        mDialog.show();
    }

    /**
     * 创建并显示一个默认的Dialog
     *
     * @param dialogId     Dialog的标识
     * @param message      内容
     * @param isCancelable 是否可以取消
     */
    protected void showDialog(int dialogId, String message, boolean isCancelable) {
        showDialog(dialogId, getStringMethod(R.string.str_dialog_title_msg),
                message, getStringMethod(R.string.str_dialog_but_confirm),
                getStringMethod(R.string.str_dialog_but_cancel), isCancelable);
    }

    /**
     * 创建并显示一个默认的Dialog
     *
     * @param dialogId Dialog的标识
     * @param message  内容
     */
    protected void showDialog(int dialogId, String message) {
        showDialog(dialogId, getStringMethod(R.string.str_dialog_title_msg),
                message, getStringMethod(R.string.str_dialog_but_yes),
                getStringMethod(R.string.str_dialog_but_no), false);
    }

    /**
     * 创建并显示一个Dialog
     *
     * @param dialogId     Dialog的标识
     * @param title        标题
     * @param message      内容
     * @param isCancelable 是否可以取消
     */
    protected void showDialog(int dialogId, String title, String message,
                              boolean isCancelable) {
        showDialog(dialogId, title, message,
                getStringMethod(R.string.str_dialog_but_confirm),
                getStringMethod(R.string.str_dialog_but_cancel), isCancelable);
    }

    /**
     * 创建并显示一个Dialog,只有一个按钮
     *
     * @param dialogId     Dialog的标识
     * @param message      内容
     * @param isCancelable 是否可以取消
     */
    protected void showSimpleDialog(int dialogId, String message,
                                    boolean isCancelable) {
        showDialog(dialogId, getStringMethod(R.string.str_dialog_title_msg),
                message, getStringMethod(R.string.str_dialog_but_confirm),
                isCancelable);
    }

    /**
     * 创建并显示一个Dialog,只有一个按钮
     *
     * @param dialogId     Dialog的标识
     * @param title        标题
     * @param message      内容
     * @param isCancelable 是否可以取消
     */
    protected void showSimpleDialog(int dialogId, String title, String message,
                                    boolean isCancelable) {
        showDialog(dialogId, title, message,
                getStringMethod(R.string.str_dialog_but_confirm), isCancelable);
    }

    /**
     * 创建并显示一个简单的自定义对话框
     *
     * @param resId        布局文件id
     * @param isCancelable 是否可以取消
     */
    protected void showSimpleCustomDialog(int resId, boolean isCancelable) {

        if (mCustomDialog != null && mCustomDialog.isShowing()) {
            mCustomDialog.dismiss();
            mCustomDialog = null;
        }
        mCustomDialog = new Dialog(this, R.style.ThemeTransparent);
        mCustomDialog.setCancelable(isCancelable);
        mCustomDialog.setCanceledOnTouchOutside(isCancelable);
        mCustomDialog.setContentView(resId);
        mCustomDialog.show();
    }

    /**
     * 创建并显示一个简单的自定义对话框
     *
     * @param view         view
     * @param isCancelable 是否可以取消
     */
    protected void showSimpleCustomDialog(View view, boolean isCancelable) {

        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null) {
            parent.removeView(view);
        }

        if (mCustomDialog != null && mCustomDialog.isShowing()) {
            mCustomDialog.dismiss();
            mCustomDialog = null;
        }
        mCustomDialog = new Dialog(this, R.style.ThemeTransparent);
        mCustomDialog.setCancelable(isCancelable);
        mCustomDialog.setCanceledOnTouchOutside(isCancelable);
        mCustomDialog.setContentView(view);
        mCustomDialog.show();
    }

    /**
     * 关闭当前显示的自定义对话框
     */
    protected void dismissCurCustomDialog() {
        try {
            if (mCustomDialog != null) {
                mCustomDialog.dismiss();
                mCustomDialog = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 点击确认按钮的回调方法(子类可实现该方法)
     *
     * @param dialogId 一个Activity可能有多个AlertDialog，这个id是来区别我们点击的是哪个AlertDialog
     */
    protected void onPositive(int dialogId) {
    }

    /**
     * 点击取消按钮的回调方法，我们一般点取消都是关闭AlertDialog,这里我预留一个回调方法在这里(子类可实现该方法)
     *
     * @param dialogId
     */
    protected void onNegative(int dialogId) {

    }
    /**
     * 退出应用
     */
    protected void exitApplication() {
        AppActivityManager.getInstance().exit();
    }

    /**
     * 双击退出应用
     **/
    private Handler handler = new Handler();
    private Boolean isExit = false;
    private Toast toast;

    /**
     * 双击退出函数
     */
    protected void exitBy2Click() {

        if (isExit) {
            toast.cancel();
            finish();
            exitApplication();
        } else {
            isExit = true;
            toast = Toast.makeText(this,
                    getStringMethod(R.string.str_exit_alert),
                    Toast.LENGTH_SHORT);
            toast.show();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    isExit = false;
                }
            }, 2500);
        }
    }
}
